﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QLabel>
#include <QTranslator>
#include <QTableWidget>
#include <QSqlDatabase>
#include <QSqlError>
#include <QStringList>
#include <QMap>
#include <QSet>
#include <QProcess>
#include <QSoundEffect>

#include <QSqlQuery>
#include "textview.h"
#include "bmpbutton.h"
#include "qextserialport.h"

#include "SCheckBoxHeaderView.h"
#include "threadsocket.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    SCheckBoxHeaderView *m_checkHeader;
    QSqlDatabase db1; //jzdb2

    struct Jiaoyan
    {
    public:
        QString Sj = ""; //
        QString Jg = ""; //
        Jiaoyan(const QString& Sj, const QString& Jg) {
            this->Sj = Sj;
            this->Jg = Jg;
        }
    };

    struct Ttime
    {
    public:
        QString stime = ""; //
        QString etime = ""; //
        QString flag = ""; //
        Ttime(const QString& stime, const QString& etime, const QString& flag) {
            this->stime = stime;
            this->etime = etime;
            this->flag = flag;
        }
    };

    QList<Jiaoyan> l; //存放已经校验时间
    QList<Ttime> ll; //存放要校验的记录
    QStringList arr;//0:本地数据库,1:远程数据库,2:检针机串口,3:扫码器串口,4:统计APP地址,5:检针机注册

    struct Barcodeinfo
    {
    public:
        QString stime = ""; //
        QString etime = ""; //
        QString flag = ""; //
        Barcodeinfo() {
        }
    };
    static Barcodeinfo barcodeinfo;

private:
    void initUI();
    void setSlot();
    void initCom();
    void initDevice();//初始化产线名
    void initDB();
    void getjiaoyanjilu();
    void setjiaoyanjilu();
    void getjiaoyanshizhe();

    void initListview2();
    void updateData();
    void getData23();

    void initJiaoZhengListview();
    void setjiaoyandetails();


private slots:
    void onJiaozhen();
    void onZhengchang();
    void onSetting();
    void onExit();

    void openSerialport();
    void closeSerialport();

    void jz_readData();            //读取检针机串口数据
    void accuracy_readData();         //读取扫码枪串口数据
    void saoma_readData();         //读取扫码枪串口数据
    void rfidtable_readData();         //rfid表读数据

    void sendData(const QString& data, bool isHex);//发送串口数据带参数
    void calljzj();//呼叫检针机（）
    void popJzMsg();//校正提醒

    void docommand_jz(const QString& data);
    void docommand_accuracy(const QString& data);
    void docommand_saoma(const QString& data);
    void saveLinesn(const QString& Linename, const QString& Sn);
    void sqlexecute(const QString& sql, int type);//0 -- db1  1-- db2

    void udateuibydb();

    void closeDB();
    void resetData();//清空数据-duanzhen esm_md_chanliang_list hostorydata

     void doHege();//最终判定
     void doDuanzhen();//最终判定

     void updateLushuList(int nLushu, bool bRet);

private:
    TextView* mChupan_t;//初判
    TextView* mChupan;//初判  --- 检针机记录的金属数，终检确认，== 检针记录数
    TextView* mXrayTobeConfirm_t;
    TextView* mXrayTobeConfirm;//X-Ray待确认数
    TextView* mHgs_t;//合格数
    TextView* mHgs;//合格数
    TextView* mXrayFail_t;//
    TextView* mXrayFail;//X-Ray确认不合格数

    TextView* mJy00;//校验
    TextView* mJy01;//检测
    TextView* mJy10;//检出
    TextView* mJy11;//检出数
    TextView* mJy20;//漏检
    TextView* mJy21;//漏检数

    TextView* button11;//校验记录
    TextView* button12;//校验记录
    TextView* button13;//校验记录
    TextView* button14;//校验记录
    TextView* label29;//校验记录
    TextView* label28;//校验记录
    TextView* label27;//校验记录
    TextView* label26;//校验记录

    TextView* mZt;//检针机状态

    BmpButton* mJiaozhen;//校正
    BmpButton* mZhengchang;//正常
    BmpButton* mLuru;//录入
    BmpButton* mPrint;//打印
    BmpButton* mSetting;//设置
    BmpButton* mExit;

    TextView* mAccuracy;//灵敏度
    TextView* mTiaoma;//条码
    TextView* mDingdan;//订单

    TextView* mWebview;//Webview

    QTableWidget *tableWidget2 = NULL;
    QTableWidget *tableWidget3 = NULL;

    QWidget *fg1;
    QWidget *fg3;
    //
    bool comOk;                 //串口是否打开
    QextSerialPort *jz_com;     //检针机串口通信对象
    QextSerialPort *accuracy_com; //灵敏度串口通信对象
    QextSerialPort *saoma_com;  //扫码枪通信对象
    QTimer *jz_timerRead;       //定时读取检针机串口数据
    QTimer *accuracy_timerRead; //定时读取灵敏度串口数据
    QTimer *saoma_timerRead;    //定时读取扫码枪串口数据
    QTimer *timerUpdatedata;    //定时刷新数据（DB => 页面）
    // 定时读取rfid_insert_list表，有新数据，合格加1
    QTimer *timerReadRfidtable;  //定时读取rfid_insert_list表

    int sleepTime;              //接收延时时间
    int sendCount;              //发送数据计数
    int receiveCount;           //接收数据计数

    int wubao = 0;              //误报数
    int hege = 0;               //合格数
    int zongshu = 0;            //总数 = 合格数 + MD初判金属数
    int chupan = 0;             //初判 -- == 金属数
    int jinshu = 0;             //最终金属数
    QString UPC = "";           //当前扫的条码
    int accuracy = 0;           //当前的灵敏度
    int sensors = 0;            //总路数
    int current_lushu = 0;      //当前检测路数
    int pre_lushu = 0;          //上一次的检测路数
    QString JZ_UUID = "";       //校正路数的UUID
    QMap<int, int> myMap;       //路数字典
    bool bHasRFID = false;      //有没有rfid
    bool bHasXRay = false;      //有没有X光机
    QSet<QString> setRfid;          // 创建一个空的QSet，保存已经处理过的rfid标签

    int model=0;            //软件运行模式 0-- 正常模式 1--暂停（不接收检针机的数据） 2-复检  3-终检  4-校验
    int ci = 0;             //第几次检验
    int fujianzuo = 0;      //复检左
    int fujianyou = 0;      //复检右
    int fujianci = 2;       //复检次数要求   左，右一次；

    int duanzhenum = 0;     //今日断针记录数
    int checktime = 0;

    QString mLinename;     //产线名
    QString mSn;           //产线sn

    QString lastCombuffer = "";

    void playWavFile(int iType);
    QSoundEffect *effect = new QSoundEffect;

    bool bIs900N = false;   //是不是900N

    bool bHasKanban = false;    //有没有看板
    QString kanbanIP = "192.168.111.100";      //看板的固定IP
    // 创建一个QTcpSocket对象
    QTcpSocket *socket = new QTcpSocket(this);
    threadSocket m_threadSocket;


};
#endif // MAINWINDOW_H
